package 位运算;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author aodre , QQ : 480029069
 * @date 2022/12/18 16:03
 */
public class leetcode6265 {
    /*
    这道题 难道 不难 ,就是 很复杂
    但是 使用位运算的 ,感觉 还 ok
     */


    /*
    这个 解法 是让你 熟悉 stream 流的操作
    和 String 相关的 api
    普通方法
    400+ ms
     */
    public int plain(String word[]){
        int ans = 0 ;
        for(int i = 0;i < word.length;i++){
            int[] ints = word[i].chars().distinct().sorted().toArray();
            for(int j = i + 1;j < word.length;j++){
                ans += Arrays.equals(word[j].chars().distinct().sorted().toArray(),ints) == true ? 1 : 0;
            }
        }
        return ans;
    }

    /*
    注意这个位运算的 思想的运用的 地方
    为什么 可以用 一个 int 来表示 一个 str 的 字符 的种类个数!


    很快 3ms
    这个 写法 是让你明白 ,高性能的 写法,以后
    在写业务的时候 能够更加 使 代码更加的 高效,
    这个 跟代码的简洁程度 没什么关系!
    就是单纯的性能高!
     */
    public int thougt(String word[]){
        int ans = 0;
        int len = word.length;
//        int map [] = new int [len];
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i < len;i++){
            // 将一个字符串的 字符 种类 转换为 用 bit 来表示
            int bit = 0;
            for(char ch : word[i].toCharArray()){
                bit |= 1 << ch - 'a';
            }
            map.put(bit,map.getOrDefault(bit,0) + 1);
        }
        /*
          进行一个 排列组合
         */
        for(int num : map.values())
            ans += num * ( num - 1) >> 1;
        return ans;
    }

}
